#!/usr/bin/python3

import pymongo
from pymongo import MongoClient

class mongodb:
    def __init__(self, host, db, port=27017):
        '''
        :param host: str mongodb地址
        :param db: str 数据库
        :param port: int 端口，默认为27017
        '''
        host = host
        db = db
        self.port = port
        client = MongoClient(host=host, port=port)
        self.db = client[db]

    def insert_one(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的字典
        :return: 返回一个包含ObjectId类型的对象
        '''
        collection = self.db[table]
        rep = collection.insert_one(dic)
        return rep

    def insert_many(self, table, lists):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 要插入的列表，列表中的元素为字典
        :return: 返回包含多个ObjectId类型的列表对象
        '''
        collection = self.db[table]
        rep = collection.insert_many(lists)
        return rep

    def find_one(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: dict 返回单条记录的字典
        '''
        collection = self.db[table]
        rep = collection.find_one(dic)
        return rep
    def find(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: list 返回查询到记录的列表
        '''
        collection = self.db[table]
        rep = list(collection.find(dic))
        return rep
    def findLike(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: list 返回查询到记录的列表
        '''
        collection = self.db[table]
        # 模糊搜索key为"姓名"，value包含"明"的记录
        dic = {'姓名': {'$regex': '明'}}
        rep = list(collection.find(dic))
        return rep

    def delete_one(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_one(dic)
        return rep

    def delete_many(self, table, dic):
        '''
        :param table: str 数据库中的集合
        :param dic: dict 查询条件
        :return: 返回DeleteResult对象
        '''
        collection = self.db[table]
        rep = collection.delete_many(dic)
        return rep

    def update_one(self, table, condition, dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return: 返回UpdateResult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_one(condition, {'$set': dic})
        # 会把之前的数据全部用dic字典替换，如果原本存在其他字段，则会被删除
        # rep = collection.update_one(condition, dic)
        return rep

    def update_many(self, table, condition, dic):
        '''
        :param table: str 数据库中的集合
        :param condition: dict 查询条件
        :param dic: dict 更新的数据
        :return:返回UpdateResult对象
        '''
        collection = self.db[table]
        # $set 表示只更新dic字典内存在的字段
        rep = collection.update_many(condition, {'$set': dic})
        # 会把之前的数据全部用dic字典替换，如果原本存在其他字段，则会被删除
        # rep = collection.update_many(condition, dic)
        return rep


if __name__ == '__main__':
    dic = {'姓名': '小明', 'English': 100, 'math': 90}
    db = mongodb(host='192.168.9.223', db='zhw_test')
    rep = db.insert_one('test', dic)
    print(rep.inserted_id)

    lists = [{'姓名': '小明', 'English': 100, 'math': 90},
             {'姓名': '小华', 'English': 90, 'math': 100}]
    result = db.insert_many('test', lists)
    print(result.inserted_ids)

    dic = {'English': 100}
    rep = db.find('test', dic)
    print(rep)

    dic = {'English': 60}
    rep = db.delete_many('test', dic)
    print(rep.raw_result)
